package codigos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class Corregir_practicas {

    public String compilacion(String ruta) throws IOException, InterruptedException{
        //creamos un string con el nombre del ejecutable, simplemente quitando la extension.
        String ejecutable = ruta.replace(".c", "");
        try{
            //creamos el proceso para compilar la aplicación
            String[] command = {"sh","-c"," gcc " +ruta+ " -o " + ejecutable}; 
            final Process p1 = Runtime.getRuntime().exec(command); 
            
            //esperamos a que el proceso finalice
            p1.waitFor();   
        }
        catch(Exception e){
            System.out.println(e.getMessage());
        }
        return ejecutable;
    }
    
    private String scriptSinEntradas(String ruta) throws InterruptedException,IOException {
        //String que contendrá la solución
        String s1 = "";
        
        //String con los comandos que le vamos a pasar a la terminal
        String[] command = {"sh", "-c", ruta};
        
        //Creamos el proceso
        Process p = Runtime.getRuntime().exec(command);
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        //BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        
        String s;
        while ((s = stdInput.readLine()) != null) {
            s1 = s;
        }
        
        return s1;
    }
    
    private String scriptMultiplesSalidas(String ruta, List casos) throws InterruptedException,IOException 
    {
        String s1 = "";
        
        //List<String> command = new ArrayList<>();
        String[] command = {"sh", "-c", ruta};
        //Ejecutamos la compilacion de la practica
        //command.add(compilacion(ruta));
        
        ProcessBuilder builder = new ProcessBuilder(command);
        Map<String, String> environ = builder.environment();
        
        Process process = builder.start();
        OutputStream os = process.getOutputStream();
        
        for(int j = 0; j<casos.size();j++){
            String caso = (String) casos.get(j);
            caso += "\n";
            os.write(caso.getBytes());
            //os.flush();
        
        
            //os.write("1".getBytes());
            //os.flush();
            //os.close();
            os.flush();
            InputStream is = process.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;

            while ((line = br.readLine()) != null) {
                //System.out.println(line);
                s1 += line;
            }
        }
        os.close();
        return s1;
    }
    
    /*public void corregir(String ruta, String nombre) throws IOException, InterruptedException{
        //String ejecutable = ruta.replace("/alumnos/", "");
        String rutaCompilada = this.compilacion("\""+ruta+nombre+"\"");
        String rutaCompiladaProf = this.compilacion("\""+ ruta + "/../../solucion/" + nombre + "\"");
        String resultado = this.scriptMultiplesSalidas(rutaCompilada,this.listaCasos(ruta + "../../pruebas/casos.txt"));
        //String resultado = this.scriptSinEntradas(rutaCompilada);
        System.out.println("Resultados: " + resultado);
    }*/
    
    
    /* Metodo que se encarga de corregir una practica la cual nos es necesario 
       ningun parametro de entrada y cuya solucion viene dada por un fichero de
       texto el cual se comparara con la salida obtenida    */
    public int corregirSinEntradaPorFichero(String ruta, String nombre) throws IOException, InterruptedException{   
        CasosDeUso cds = new CasosDeUso();
        String solucion = (String) cds.listaCasos(ruta + "../../pruebas/casos.txt").get(0);
        String resultado = scriptSinEntradas(this.compilacion("\""+ruta+nombre+"\""));
        int nota = 0;
        if (solucion.equals(resultado))
            nota = 10;
        return nota;
    }
    
    /* Metodo que se encarga de corregir una practica la cual nos es necesario 
       ningun parametro de entrada y cuya solucion viene dada por la solución 
       del profesor la cual se comparara con la salida obtenida    */
    public int corregirSinEntradaSinFichero(String ruta, String nombre) throws IOException, InterruptedException{      
        String solucion = scriptSinEntradas(this.compilacion("\""+ruta+"../../solucion/solucion.c\""));
        String resultado = scriptSinEntradas(this.compilacion("\""+ruta+nombre+"\""));
        int nota = 0;
        if (solucion.equals(resultado))
            nota = 10;
        return nota;
    }
            
}

/* Documentación comandos

con | hace que la salida del primero se convierta en la entrada del segundo.
Con & hará que los dos (o más) comandos se ejecuten de manera simultanea.
Con || El segundo comando se ejecutará si el primero termina sin éxito.
Con && El segundo comando se ejecutará solo si el primero termina con éxito.
Con ; El segundo comando se ejecutará sin importar el resultado del primero.


*/